package com.cyou.nad.utils;

import java.lang.reflect.Method;
import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;

import com.cyou.fz173.util.BeanTools;

/**
 * Title: requets 数据提取和存放
 */
public abstract class RequestUtils {

	public static String getString(HttpServletRequest req, String name, String defaultValue) {
		String str = req.getParameter(name);
		if (StringUtils.isBlank(str))
			return defaultValue;
		return str.trim();
	}

	public static String getString(HttpServletRequest req, String name) {
		return getString(req, name, "");
	}

	public static Long getLong(HttpServletRequest req, String name, Long defaultValue) {
		String value = getString(req, name);
		try {
			return Long.valueOf(value);
		} catch (Exception e) {
			return defaultValue;
		}

	}

	public static Long getLong(HttpServletRequest req, String name) {
		String value = getString(req, name);
		return Long.valueOf(value);
	}

	/**
	 * 把request.getParameterValues(name)的 值trim()后 在转化成String[]
	 * 
	 * @param request
	 * @param name
	 * @return
	 */
	public static String[] getStrings(HttpServletRequest req, String name) {
		String[] values = req.getParameterValues(name);
		if (values == null)
			return null;
		String[] result = new String[values.length];
		for (int i = 0; i < values.length; i++) {
			result[i] = values[i].trim();
		}
		return result;
	}


	/**
	 * 把request.getParameterValues(name)的 值trim()后 在转化成Long[] 不成功返回null
	 * 
	 * @param request
	 * @param name
	 * @return
	 */
	public static Long[] getLongs(HttpServletRequest req, String name) {
		String[] values = req.getParameterValues(name);
		if (values == null)
			return null;
		Long[] result = new Long[values.length];
		for (int i = 0; i < values.length; i++) {
			try {
				result[i] = Long.valueOf(values[i].trim());
			} catch (Exception e) {

				result[i] = null;
			}
		}
		return result;
	}

	/**
	 * 这个方法用一个bean来收集request 中的数据 要求1 bean 有一个无参的构造方法 2 bean
	 * 的属性的setter的方法是public 且返回值是 String Double Integer Long
	 * 这个方法会创建bean的实例根据reques 的参数调用setter 的方法
	 * 
	 * @param clazz
	 *            bean.class
	 * @return 
	 * @return
	 */
	/**
	 * request所有数据存到javaBean中
	 * 
	 * @param request
	 * @param cla
	 *            javaBean类类型
	 * @return javaBean
	 */
	public static <T> T getBean(HttpServletRequest request, Class<T> cls) {
		T obj = null;
		try {
			obj = cls.newInstance();
			Enumeration<?> enums = request.getParameterNames(); // 获取所有上传参数名字
			while (enums.hasMoreElements()) {
				String str = (String) enums.nextElement(); // 参数名
				Method setMethod = BeanTools.getSetMethod(cls, str); // 根据参数名获取对应的set方法
				Method getMethod = BeanTools.getGetMethod(cls, str); // 根据参数名获取对应的get方法
				if (null == setMethod || null == setMethod) {
					continue;
				}
				Class<?> returnType = getMethod.getReturnType(); // 获取该变量的类型
				String value = "";
				value = request.getParameter(str);// 参数对应的值
				Object valueObj = BeanTools.getObject(returnType, value); // 获取转换后的值
				setMethod.invoke(obj, valueObj);
			}
		} catch (Exception e) {
			System.err.println(e.toString());
		}
		return obj;
	}

	/**
	 * 把request 中的 Parameter值再set 到request 中去
	 * 
	 * @param request
	 */
	public static void saveAllParameters(HttpServletRequest request) {
		String[] params;
		String key;
		for (Enumeration<?> enu = request.getParameterNames(); enu.hasMoreElements();) {
			key = (String) enu.nextElement();
			params = request.getParameterValues(key);
			if (params == null || params.length < 1) {
				;
			} else {
				request.setAttribute(key, (params.length > 1) ? (Object) params : (Object) params[0]);
			}
		}
	}

	public static void main(String[] args) {

	}
}
